package pers.jl.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import pers.jl.common.R;
import pers.jl.entity.Employee;
import pers.jl.service.IEmployeeService;

import javax.servlet.http.HttpServletRequest;


/**
 * <p>
 * 员工信息 前端控制器
 * </p>
 *
 * @author luge
 * @since 2023-04-22
 */
@RestController
@RequestMapping("/employee")
@Slf4j
public class EmployeeController {

    @Autowired
    private IEmployeeService employeeService;


    /**
     * 管理员登录功能
     * @param httpRequest
     * @param employee
     * @return
     */
    @PostMapping("/login")
    public R login(HttpServletRequest httpRequest, @RequestBody Employee employee){
        return employeeService.employeeLogin(httpRequest,employee);
    }


    /**
     * 管理员退出功能
     * @param httpRequest
     * @return
     */
    @PostMapping("/logout")
    public R logout(HttpServletRequest httpRequest){
        log.info("用户ID为"+httpRequest.getSession().getAttribute("employeeId")+"的用户退出登录");
        // 移除session中的管理员id
        httpRequest.getSession().removeAttribute("employeeId");
        return R.success("退出成功");
    }

    /**
     * 新增员工或者修改员工信息
     * 设置一些创建信息并将输入信息一起存入员工表中
     * @param request
     * @param employee
     * @return
     */
    @PostMapping
    public R saveOrUpdate(HttpServletRequest request,@RequestBody Employee employee){
        // 设置默认密码，需要使用MD5加密
        employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
        // 保存用户
        employeeService.save(employee);
        return R.success("新增员工成功。");
    }

    /**
     * 员工信息的分页查询
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")// 可以添加@RequestParam,形参和传入参数名称一致时，会报400错误。如果不添加不会报错。
    public R employeePage(Long page,Long pageSize,String name){
        // 新建page对象,传入页码和显示条数
        Page<Employee> pages = new Page<>(page,pageSize);

        // 构建条件构造器，处理用户使用按名称查询的分页查询
        LambdaQueryWrapper<Employee> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.like(!StringUtils.isEmpty(name),Employee::getName,name);

        // 执行分页操作
        employeeService.page(pages,lambdaQueryWrapper);

        // 返回page对象
        return R.success(pages);
    }

    /**
     * 修改员工账号状态功能
     * 注意用对象来接收参数
     * 这个地方我们需要根据id来修改员工状态，但是前端传来id有问题，因为前端js处理Long型数据时会丢失精度
     * 处理方法：在webmvc中配置消息转换器，将Long型数据转换成字符串类型。
     * @param request
     * @param employee
     * @return
     */
    @PutMapping
    public R employeeDisabled(HttpServletRequest request,@RequestBody Employee employee){
        // 更新用户状态(用户传来的状态就是取反之后的，所以我们不需要再累处理取反了)
        employeeService.updateById(employee);
        return R.success("修改状态成功！");
    }


    /**
     * 员工信息编辑功能
     * 根据id查询员工信息返回给页面进行回显，
     * 回显之后，用户点击保存就会调用前面我们写好的saveOrUpdate接口二进行genxing
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public R employeeEdit(@PathVariable Long id){
        // 根据员工id查询员工信息
        Employee employee = employeeService.getById(id);
        if (employee != null) {
            // 返回员工数据
            return R.success(employee);
        }
        return R.error("员工不存在！");
    }
}
